# 在Windows平台上文件路径各个目录之间用反斜杠'\'或者斜杠'/'隔开都可以
# 我们写的时候用斜杠即可 因为转义字符的原因 使用反斜杠可能混淆
#############################################################################

# 打开一个文件
# 打开文件使用open函数 返回值是一个文件对象 通过这个文件对象就可以操作打开的文件 
# 打开的文件的路径就是open的第一个参数 打开的方式用很多 比如读方式'r'、写方式'w'、追加写方式'a'
# 打开文件必须关闭
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r')
# print(f) # 打印的文件对象
# print(type(f)) # 打印的就是这个文件对象类型名称
# f.close()

#############################################################################
# 打开文件为什么要关闭
# 打开的文件申请了系统资源 不及时关闭就会造成资源泄露
# f_list = []
# cnt = 0
# while True:
#     f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r')
#     f_list.append(f)
#     cnt += 1
#     print(f'文件对象个数 = {cnt}')

#最终cnt为8189 这说明打开文件是存在限制的 因为内存不是无限大的
# 其实python中存在自动关闭文件的机制 但是在一些情况下还是手动回收好一点 
# 因为自动回收可能不及时 造成一些问题

# 如何验证自动回收机制存在呢 现在不向列表里面插入文件对象继续运行这段代码
# cnt = 0
# while True:
#     f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r')
#     cnt += 1
#     print(f'文件对象个数 = {cnt}')
# 此时会一直打印 因为自动回收机制 
# 上面的像列表里面插入 python认为这个文件对象可能还会使用因此不会自动关闭
# 这里会自动关闭 因为 cnt一直加
# f.close()

#############################################################################
# 使用w、r、a来练习

# w：打开一个文件 存在则清空写 不存在即新建写 
# 写调用的方法为write
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test1.txt', 'w')
# f.write('hello Python')
# f.close()

# a：追加写 文件存在每次打开写入的时候不会清空而是向后面追加写
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test1.txt', 'a')
# f.write('hello Python\n')
# f.close()

# r：读文件
# read方法 参数为想要读几个字符
# 当读的文件是中文是 可能出现编码不一致的问题 此时在open函数里面指明第三个参数encoding
# 一般是utf8
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r', encoding = 'utf8')
# a = f.read(5)
# print(type(f.read()))
# print(a)
# f.close()
# 读整个文件的方式 循环读 每次读一行
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r', encoding = 'utf8')
# for line in f:
#     print(line, end = '') # print函数可以指明输出结束字符
# f.close()

# 还有一种方式 使用接口readlines 以行为单位 将文件内容放到一个列表里面
# f = open('D:/CodeLog/GitteTwo/python/Python代码/test.txt', 'r', encoding = 'utf8')
# f_lines = f.readlines()
# print(f_lines)
# print(type(f_lines))
# f.close() 

# python中的上下文管理器 自动关闭打开的文件
def func():
    with open(' D:\CodeLog\GitteTwo\python\Python代码/text.txt', encoding = 'utf8') as f:
        # 这里有很多行代码
        # ......
        if cond:
            return
        # 这里有很多行代码
        # ......
# 使用上下文管理器的优点就是在多行代码中避免漏掉某一个关闭文件的操作 在打开文件的代码块结束的时候
# 自动关闭打开的文件 避免内存泄漏
